Build a Location Reminder App

User Authentication

Criteria Meet Specification

Create Login and Registration screens

Login screen allows users to login using email or a Google Account

If the user does not exist, the app navigates to a Registration screen

Enable user accounts using Firebase Authentication and Firebase UI.

The project includes a FirebaseUI dependency

Authentication is enabled through the Firebase console.

Map View

Criteria Meet Specification

Create a Map view that shows the user's current location

A screen that shows a map and asks the user to allow the location permission to show his location on the map.

The app works on all the different Android versions including Android Q.

Add functionality to allow the user to select POIs to set reminders

The app asks the user to select a location or POI on the map and add a new marker at that location
Upon saving, the selected location is returned to the Save Reminder page and the user is asked to input the title and description for the reminder.

When the reminder is saved, a geofencing request is created.

Style the map

Map Styling has been updated using the map styling wizard to generate a nice looking map.

Users have the option to change map type.

Display a notification when a selected POI is reached

When the user enters a geofence, a reminder is retrieved from the local storage and a notification showing the reminder title will appear, even if the app is not open..

Reminders

Criteria Meet Specification

Add a screen to create reminders

Reminder data includes title and description.

The user-entered data will be captured using live data and data binding.

RemindersLocalRepository is used to save the reminder to the local DB. And the geofencing request will be created after confirmation.

Add a list view that displays the reminders

All reminders in the location DB is displayed

If the location DB is empty, a no data indicator is displayed.

User can navigate from this screen to another screen to create a new reminder.

Display details about a reminder when a selected POI is reached and the user clicked on the notification.

When the user clicks a notification, when he clicks on it, a new screen appears to display the reminder details.

Testing

Criteria Meet Specification

Use MVVM and Dependency Injection to architect your app.

The app follows the MVVM design pattern and uses ViewModels to hold the live data objects, do the validation and interact with the data sources.

The student retrieved the ViewModels and DataSources using Koin.

Test the ViewModels, Coroutines, and LiveData

RemindersListViewModelTest or SaveReminderViewModelTest are present in the test package that tests the functions inside the view model.

Live data objects are tested using shouldReturnError and check_loading testing functions.

Create a FakeDataSource to replace the Data Layer and test the app in isolation.

Project repo contains a FakeDataSource class that acts as a test double for the LocalDataSource.

Use Espresso and Mockito to test the app UI and Fragments Navigation.

Tests include:

  • Automation Testing using ViewMatchers and ViewInteractions to simulate user interactions with the app.
  • Testing for Snackbar and Toast messages.
  • Testing the fragments’ navigation.
  • The testing classes are at androidTest package.

Test DAO and Repository classes

Testing uses Room.inMemoryDatabaseBuilder to create a Room DB instance.

Testing covers:

  • inserting and retrieving data using DAO.
  • predictable errors like data not found.

Code Quality

Criteria Meet Specification

Write code using best practices for Android development with Kotlin

Code uses meaningful variable names and method names that indicate what the method does.

Tips to make your project standout:

  1. Test Coverage for the whole app.
  2. Update the app styling and map design using material design and map design.
  3. Edit and Delete Reminders and Geofence requests.
  4. Allow the user to create a shape like polygons or circles on the map to select the area.
  5. Allow the user to change the reminding location range.